# -*- coding: utf-8 -*-
"""
空气物性计算模块

功能：提供空气物性参数的计算功能，包括湿球温度、焓值、含湿量等
作者：zq
日期：25.08.26
版本：1.0
"""

import numpy as np
from datetime import datetime

def calc_wet_bulb_temperature(T, RH):
    """
    计算湿球温度
    
    功能：根据干球温度和相对湿度计算湿球温度
    参数：
        T (float): 干球温度，单位：摄氏度(℃)
        RH (float): 相对湿度，单位：百分比(%)
    返回值：
        float: 湿球温度，单位：摄氏度(℃)
    """
    Tw = (
        T * np.arctan(0.151977 * (RH + 8.313659) ** 0.5)
        + np.arctan(T + RH)
        - np.arctan(RH - 1.676331)
        + 0.00391838 * RH ** 1.5 * np.arctan(0.023101 * RH)
        - 4.686035
    )
    return Tw

def calc_air_enthalpy_by_t_rh(t, rh, p=101.325):
    """
    根据温度和相对湿度计算空气焓值
    
    功能：基于干球温度、相对湿度和大气压计算湿空气的焓值
    参数：
        t (float): 干球温度，单位：摄氏度(℃)
        rh (float): 相对湿度，单位：百分比(%)，如50表示50%
        p (float): 大气压，单位：千帕(kPa)，默认值101.325
    返回值：
        float: 湿空气焓值，单位：千焦每千克(kJ/kg)
    """
    rh = rh / 100  # 转为0~1
    # 饱和水汽压（kPa）
    p_ws = 6.112 * np.exp(17.67 * t / (t + 243.5)) * 0.1
    # 实际水汽分压力
    p_w = rh * p_ws
    # 绝对湿度
    d = 0.622 * p_w / (p - p_w)
    # 焓值
    h = 1.006 * t + d * (2501 + 1.805 * t)
    return h

def calculate_humidity_ratio(t, rh, p=101.325):
    """
    计算空气含湿量
    
    功能：根据温度和相对湿度计算空气的含湿量（绝对湿度）
    参数：
        t (float): 干球温度，单位：摄氏度(℃)
        rh (float): 相对湿度，单位：百分比(%)，如50表示50%
        p (float): 大气压，单位：千帕(kPa)，默认值101.325
    返回值：
        float: 含湿量，单位：千克水蒸气每千克干空气(kg/kg)
    """
    rh = rh / 100  # 转为0~1
    # 饱和水汽压（kPa）
    p_ws = 6.112 * np.exp(17.67 * t / (t + 243.5)) * 0.1
    # 实际水汽分压力
    p_w = rh * p_ws
    # 含湿量（绝对湿度）
    d = 0.622 * p_w / (p - p_w)
    return d
